// 给定一个数组 candidates 和一个目标数 target ，找出 candidates 中所有可以使数字和为 target 的组合。

// candidates 中的每个数字在每个组合中只能使用一次。
/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
var combinationSum2 = function (candidates, target) {
  let res = []
  let n = candidates.length
  candidates.sort((a,b)=>a-b)  // 排序
  function help(index,combine,target){
    if(target === 0 ){
      res.push([...combine])
      return 
    }
    for (let i = index; i < n; i++) {
      // 前面的数 已经包含了下一个的所有情况
      if (i > 0 && candidates[i] === candidates[i-1]){
        continue
      }
      let value = candidates[i]
      if(target - value >=0){
        help(i+1,[...combine,value],target-value)
      }
      
    }
  }
  help(0,[],target)
  return res
};

var candidates = [10, 1, 2, 7, 6, 1, 5], target = 8
console.log(combinationSum2(candidates,target))
